home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / wais / ui / waisq.c < prev   
C/C++ Source or Header  |  1995-05-09  |  9KB  |  374 lines

  1. /* 
  2.   WIDE AREA INFORMATION SERVER SOFTWARE:
  3.    No guarantees or restrictions.  See the readme file for the full standard
  4.    disclaimer.
  5.  
  6.    This is part of the shell user-interface tools for the WAIS software.
  7.    Do with it as you please.
  8.  
  9.    jonathan@Think.COM
  10.  
  11.  * $Log:    waisq.c,v $
  12.  * Revision 1.24  92/04/29  13:20:27  jonathan
  13.  * Updated for release.
  14.  * 
  15.  * Revision 1.23  92/04/01  17:21:27  jonathan
  16.  * changed loadsource to findsource (which now loads if necessary).
  17.  * 
  18.  * Revision 1.22  92/03/17  14:36:06  jonathan
  19.  * Modified to use new ui functions in wais-ui.  Generally cleaned up.
  20.  * 
  21.  * Revision 1.21  92/03/06  14:52:02  jonathan
  22.  * New and Improved source loading!
  23.  * 
  24.  * Revision 1.20  92/02/29  19:40:10  jonathan
  25.  * Only read source for waisping (not all sources).  Much faster.
  26.  * 
  27.  * Revision 1.19  92/02/15  19:47:52  jonathan
  28.  * Added $Log for RCS
  29.  * 
  30. */
  31.  
  32. #include "wais.h"
  33.  
  34. #define MAIN
  35. #include "globals.h"
  36.  
  37. #define WAISQ_DATE "Wed Apr 29 1992"
  38.  
  39. char* log_file_name = NULL;
  40. FILE* logfile = NULL;
  41.  
  42. /* this will take as its argument the name of a question file,
  43.    and will do all the right things with it.
  44. */
  45.  
  46.  
  47. void
  48. PrintStatus(str)
  49. char * str;
  50. {
  51.   fprintf(stderr, "%s", str);
  52. }
  53.  
  54.  
  55. usage(name) 
  56. char *name;
  57. {
  58.   if (strstr(name, "waisq") != NULL) {
  59.     fprintf(stderr,"Usage: waisq\n");
  60.     fprintf(stderr,"  [-f question_file] /* defaults to stdin, stdout */\n");
  61.     fprintf(stderr,"  [-s sourcedir] /* or environment variable WAISSOURCEDIR, or ~/wais-sources/ */\n");
  62.     fprintf(stderr,"  [-S sourcename]\n");
  63.     fprintf(stderr,"  [-c common_sourcedir] /* or environment variable WAISCOMMONSOURCEDIR */\n");
  64.     fprintf(stderr, " [-m max_Result_Docs] /* defaults to 40 */\n");
  65.     fprintf(stderr,"  [-v document_number]\n");
  66.     fprintf(stderr,"  [-g]    /* to do a search */\n");
  67.     fprintf(stderr,"  [-h]    /* this message */\n");
  68.     fprintf(stderr,"  [-t]    /* test a source */\n");
  69.     fprintf(stderr,"  [-V]    /* print version */\n");
  70.     fprintf(stderr,"  [word [word [...]]]\n");
  71.     fprintf(stderr,"or %s -    /* interactive mode */\n", name);
  72.   }
  73.   else {
  74.     fprintf(stderr,"Usage: waisping\n");
  75.     fprintf(stderr,"  [-s sourcedir] /* or environment variable WAISSOURCEDIR, or ~/wais-sources/ */\n");
  76.     fprintf(stderr,"  [-c common_sourcedir] /* or environment variable WAISCOMMONSOURCEDIR */\n");
  77.     fprintf(stderr,"  sourcename\n");
  78.   }
  79. }
  80.  
  81. void SetSource(question, sourcename)
  82. Question question;
  83. char *sourcename;
  84. {
  85.   SourceList s;
  86.   SourceID sid;
  87.  
  88.   sid = (SourceID)s_malloc(sizeof(_SourceID));
  89.   s = (SourceList)s_malloc(sizeof(_SourceList));
  90.   s->thisSource = sid;
  91.   s->nextSource = NULL;
  92.   sid->filename = sourcename;
  93.   question->Sources = s;
  94. }
  95.  
  96. char *
  97. fixdirname(dir)
  98. char *dir;
  99. {
  100.   char *res;
  101.  
  102.   if(dir[strlen(dir)-1] == '/') res = dir;
  103.   else {
  104.     res = s_malloc(strlen(dir)+2);
  105.     sprintf(res,"%s/", dir);
  106.   }
  107.   return res;
  108. }
  109.  
  110. main(argc, argv)
  111.      int argc;
  112.      char *argv[];
  113. {
  114.   Question question;
  115.   char msg[STRINGSIZE];
  116.   char *qfilename, *sourcename;
  117.   char keywords[STRINGSIZE];
  118.   int i, document_number;
  119.   Boolean dosearch, interactive_mode, test_mode, rescan;
  120.   FILE *fp;
  121. #ifndef SABER
  122.   char *getenv();
  123. #endif
  124.  
  125.   if (command_name = (char*)rindex(argv[0], '/'))
  126.     command_name++;
  127.   else
  128.     command_name = argv[0];
  129.  
  130.   sdir = cdir = qfilename = sourcename = NULL;
  131.   keywords[0] = 0;
  132.   document_number = -1;
  133.   dosearch = interactive_mode = test_mode = FALSE;
  134.  
  135.   NumSources = 0;
  136.   maxDocs = 40;
  137.  
  138.   if(strstr(argv[0], "waisping") != NULL) test_mode = TRUE;
  139.  
  140.   /* parse arguments */
  141.  
  142.   if (argc == 1) {
  143.     usage(argv[0]);
  144.     exit(0);
  145.   }
  146.  
  147.   /* if the first arg is '-', do interactive mode */
  148.  
  149.   i = 1;
  150.  
  151.   if((argv[1][0] == '-') && (argv[1][1] == 0)) {
  152.     interactive_mode = TRUE;
  153.     i++;
  154.   }
  155.   for(; i < argc; i++) {
  156.     if (*argv[i] == '-') {
  157.       argv[i]++;
  158.       switch (*argv[i]) {
  159.       case 'f':
  160.     i++;
  161.     if(i >= argc) {
  162.       fprintf(stderr, "Too few arguments: file name missing.\n");
  163.       exit(1);
  164.       }
  165.     qfilename = argv[i];
  166.     break;
  167.       case 'c':
  168.     i++;
  169.     if(i >= argc) {
  170.       fprintf(stderr, "Too few arguments: source directory missing.\n");
  171.       exit(1);
  172.       }
  173.     cdir = argv[i];
  174.     break;
  175.       case 's':
  176.     i++;
  177.     if(i >= argc) {
  178.       fprintf(stderr, "Too few arguments: source directory missing.\n");
  179.       exit(1);
  180.       }
  181.     sdir = argv[i];
  182.     break;
  183.       case 'S':
  184.     i++;
  185.     if(i >= argc) {
  186.       fprintf(stderr, "Too few arguments: source name missing.\n");
  187.       exit(1);
  188.       }
  189.     sourcename = argv[i];
  190.     break;
  191.       case 'm':
  192.     i++;
  193.     if(i >= argc) {
  194.       fprintf(stderr, "Too few arguments: source name missing.\n");
  195.       exit(1);
  196.       }
  197.     maxDocs = atoi(argv[i]);
  198.     break;
  199.       case 'v':
  200.     i++;
  201.     if(i >= argc) {
  202.       fprintf(stderr, "Too few arguments: Document number missing.\n");
  203.       exit(1);
  204.       }
  205.     document_number = atoi(argv[i]);
  206.     break;
  207.       case 'g':
  208.     dosearch = TRUE;
  209.     break;
  210.       case 'h':
  211.     usage(argv[0]);
  212.     exit(0);
  213.     break;
  214.       case 't':
  215.     test_mode = TRUE;
  216.     break;
  217.       case 'V':
  218.     printf("%s version: %s, %s.\n", argv[0], VERSION, WAISQ_DATE);
  219.     exit(0);
  220.       default:
  221.     fprintf(stderr, "Unknown option: %s.\n", argv[i]);
  222.     exit(1);
  223.       }
  224.     }
  225.     else {
  226.       if(test_mode)
  227.     strcpy(keywords, argv[i]);
  228.       else if((strlen(keywords) + strlen(argv[i]) + 1) < STRINGSIZE) {
  229.     strcat(keywords, argv[i]);
  230.     strcat(keywords, " ");
  231.       }
  232.     }
  233.   }
  234.       
  235.   if(sdir == NULL) {
  236.     if((sdir = getenv("WAISSOURCEDIR")) == NULL) {
  237.       sprintf(msg, "%s/wais-sources/", getenv("HOME"));
  238.       sdir = s_strdup(msg);
  239.     }
  240.   }
  241.  
  242.   if(cdir == NULL) cdir = getenv("WAISCOMMONSOURCEDIR");
  243.  
  244.   sdir = fixdirname(sdir);
  245.  
  246.   if(cdir != NULL) {
  247.     cdir = fixdirname(cdir);
  248.   }
  249.  
  250.   the_Question = (Question)s_malloc(sizeof(_Question));
  251.  
  252.   if(test_mode) {
  253.  
  254.     question = the_Question;
  255.  
  256.     SetSource(question, keywords);
  257.     if(findsource(keywords) == NULL) {
  258.       PrintStatus("Can't find source: ");
  259.       PrintStatus(keywords);
  260.       PrintStatus("\n");
  261.     }
  262.     else
  263.       test_connection(question);
  264.     exit(0);
  265.   }
  266.  
  267.   else if(!interactive_mode) {
  268.     if (qfilename != NULL) {
  269.       if(strcmp(qfilename, "-")) {
  270.     if((fp = fopen(qfilename, "r")) == NULL) {
  271.       fprintf(stderr, "Can't open question %s\n", qfilename);
  272.       exit(-1);
  273.     }
  274.     ReadQuestion(the_Question, fp);
  275.     fclose(fp);
  276.       }
  277.     }
  278.     else {
  279.       fp = stdin;
  280.       ReadQuestion(the_Question, fp);
  281.     }
  282.  
  283.     question = the_Question;
  284.  
  285.     question->modified = TRUE;
  286.  
  287.     question->numsources =
  288.       listlength((List)question->Sources);
  289.  
  290.     question->numdocs =
  291.       listlength((List)question->RelevantDocuments);
  292.  
  293.     question->numresdocs =
  294.       listlength((List)question->ResultDocuments);
  295.  
  296.     if (keywords[0] != 0) {
  297.       strcpy(question->keywords,keywords);
  298.     }
  299.  
  300.     if (sourcename != NULL) {
  301.       SetSource(question, sourcename);
  302.     }
  303.  
  304.     if(dosearch == TRUE) {
  305.       SearchWais(question);
  306.       if((qfilename == NULL) || (strcmp(qfilename, "-") == 0))
  307.     WriteQuestionfp(stdout, question);
  308.       else
  309.     WriteQuestion(qfilename, question);
  310.     }
  311.     else if((qfilename != NULL) &&
  312.         strcmp(qfilename, "-") == 0)
  313.       WriteQuestionfp(stdout, question);
  314.  
  315.     if((document_number > 0) && (document_number <= question->numresdocs)) {    /* view a document */
  316.       DocumentID doc;
  317.       char *viewbuffer;
  318.       long size = 0;
  319.  
  320.       if((doc = findDoc(question->ResultDocuments, document_number-1))
  321.      == NULL) {
  322.     PrintStatus("Unable to find document.  This should not happen.\n");
  323.     return;
  324.       }
  325.       GetWaisDocument(question, doc, 
  326.               doc->doc->type[0], stdout, &size);
  327.     }
  328.   }
  329.   else {
  330.     /* interactive mode!
  331.        read questions from standard in, write to stdout, until an empty question comes through.
  332.        */
  333.     question = the_Question;
  334.     while(interactive_mode) {
  335.       if(ReadQuestion(question, stdin)) {
  336.     question->modified = TRUE;
  337.     question->numsources =
  338.       listlength((List)question->Sources);
  339.     question->numdocs =
  340.       listlength((List)question->RelevantDocuments);
  341.     question->numresdocs =
  342.       listlength((List)question->ResultDocuments);
  343.  
  344.     /* cases */
  345.     if((strlen(question->keywords) != 0) ||
  346.        (question->numdocs > 0)) {
  347.       SearchWais(question);
  348.       WriteQuestionfp(stdout, question);
  349.     }
  350.     else if(question->numresdocs > 0)
  351.       for(i = 0; i < question->numresdocs; i++) {
  352.         char* viewbuffer;
  353.         long size = 0;
  354.         DocumentID doc;
  355.  
  356.         doc = findDoc(question->ResultDocuments, i);
  357.         if(doc != NULL) {
  358.           GetWaisDocument(question, doc, doc->doc->type[0],
  359.                   stdout, &size);
  360.         }
  361.       }
  362.     else {
  363.       SearchWais(question);
  364.       WriteQuestionfp(stdout, question);
  365.     }
  366.     fflush(stdout);
  367.     PrintStatus("Waisq: Ready for next question.\n");
  368.       }
  369.       else interactive_mode = FALSE;
  370.     }
  371.   }
  372.   exit(0);
  373. }
  374.